package rpc

import (
	"encoding/binary"
	"io"
	"net"
)

//编写会话中数据读写

// Session 会话连接结构体
type Session struct {
	conn net.Conn
}

//NewSession 创建一个链接

func NewSession(conn net.Conn) *Session {
	return &Session{
		conn: conn,
	}
}

// Write 向连接中写数据
func (s *Session) Write(data []byte) error {
	// 4字节头+数据
	buf := make([]byte, len(data)+4)
	// 写入头部数据，记录数据长度
	// binary只认固定长度的类型，所以使用了uint32，不是直接写入
	binary.BigEndian.PutUint32(buf[:4], uint32(len(data)))
	// 写入数据
	copy(buf[4:], data)
	_, err := s.conn.Write(buf)
	return err
}

// Read 连接中读取数据
func (s *Session) Read() ([]byte, error) {
	header := make([]byte, 4)
	// 读取头部长度
	_, err := io.ReadFull(s.conn, header)
	if err != nil {
		return nil, err
	}
	// 读数据长度
	dataLen := binary.BigEndian.Uint32(header)
	data := make([]byte, dataLen)
	_, err = io.ReadFull(s.conn, data)
	if err != nil {
		return nil, err
	}
	return data, nil
}
